﻿package reglas {
	
	
	import flash.events.*;
	import flash.utils.*;
	
	import motor.colision.*;
	import reglas.movimiento.*;
	import reglas.entidades.*;
	
	import juego.naves.*;
	import motor.grafico.*;
	
	public class Universo
	{
		
		static public var DEBUG_VERBOSE:Boolean = true;
		
		static private var instancia:Universo = null;
		
		private var entidades:Array;
		
		//private var timer:Timer; Se utilizara el timer de LineaTiempo, no tiene sentido que usen Timer diferentes (26/02/2011)
		
		
		private var lineaT:LineaTiempo = null;
		
		private var admM:AdmMovimiento;
		
		public var currentTime:Number;
		
		public function Universo ()
		{
			lineaT = new LineaTiempo(1000/Graficos.getInstancia().getStage().frameRate);			
			lineaT.addEventListener(LineaTiempo.EVENT_FIN_ANIMA,animar);
		
			entidades = new Array();
			//timer = new Timer(1000/24);
			//timer.start();
		}
		
		public static function getInstancia()
		{
			if (instancia==null)
			{
				instancia = new Universo();
			}
			return instancia;
		}
		
		public function getTiempoUniversal():uint
		{
			return lineaT.getTiempoUniversal();
		}
		
		public function animar (e:Event):void
		{
			var currentDate:Date = new Date();
			var currentMS:Number = currentDate.time;
			
			currentTime = currentMS;
			
			//if (DEBUG_VERBOSE) trace ("Universo.animar");
			// YA SE DISPARARON TODAS LAS COLISIONES Y SUS EFECTOS.			
			if (entidades!=null)
			{
				//EJECUTAR LOS ADM DE MOV
				if (admM!=null)
				{
					admM.animar();
				}
				
				//Y Ahora los animar de las entidades.
				var i:int = 0;
				var currentEntidad:Entidad = null;
				for (i=0;i<entidades.length;i++)
				{
					currentEntidad = entidades[i];
					currentEntidad.animar();					
				}				
			} 
			else
			{
				trace("Universo.animar: entidades == null");
			}			
			//ultimaColision = null;//Debemos borrar la ultima colision luego animar todos los cuerpos.
		}
		
		public function crearEntidadTest1()
		{
			var entidad:Entidad = new Entidad(100,100,+100,0,"Test1");
			entidades.push(entidad);
		}
		
		public function crearEntidadTest2()
		{
			var entidad:Entidad = new Entidad(200,100,-50,0,"Test2");
			entidades.push(entidad);
		}
		
		public function crearEntidadTestRandom(i:Number)
		{
			var velX:Number = 5;
			if (Math.random()<0.5)
			{
				//velX = -velX;
			}			
			
			var velY:Number = 20+Math.random()*80;
			if (Math.random()<0.5)
			{
				//velY = -velY;
			}
			
			var xI:Number = i % 24;
			var yI:Number = i / 24;
			
			var entidad:EntidadControladaMovimiento = new EntidadControladaMovimiento(xI*11,yI*11,"Test2");
			entidades.push(entidad);
			//entidad.updateEstado1(EntidadControladaMovimiento.ESTADO_MOV_GIRO_DER);
		}
		
		public function crearEntidadTestControlada1()
		{
			var entidad:EntidadControladaMovimiento = new EntidadControladaMovimiento(200,300,"Test3");			
		}
		
		public function crearEntidadTestControlada2()
		{
			var entidad:EntidadControladaMovimiento = new EntidadControladaMovimiento(300,300,"Test3");
			entidades.push(entidad);
			//----
			admM = new AdmMovTeclado(entidad);
		}
		
		public function crearNave1()
		{
			var nave:Nave = new Nave(300,300,"Test3",Cuerpos.TIPO_GRUPO_B);			
			entidades.push(nave);
			//----
			admM = new AdmMovTeclado(nave);
			nave.addObserver(admM);
		}
		
		public function getEntidadIndex (unaEntidad:Entidad):int
		{
			var pos:int = -1;
			var i:int = 0;
			while ((i<entidades.length) && (pos!=-1))
			{
				if (entidades[i]==unaEntidad)
				{
					pos=i;
				}
				i++;
			}
			return pos;
		}
		
		public function destroyEntidad(unaEntidad:Entidad)
		{
			var pos:int = getEntidadIndex(unaEntidad);
			entidades.splice(pos,1);
			return;
		}
		
		public function destroyAdmMovimiento(unAdmMov:AdmMovimiento)
		{
			trace ("Universo.destroyAdmMovimiento: TODO!");
			admM=null;
		}
		
		public function destroyUniverso()
		{
			lineaT.removeEventListener(LineaTiempo.EVENT_FIN_ANIMA,animar);
		}
		
	}
	
}